#ifndef COMPILER_ONLINE

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath>

using namespace std;

struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};
#include "header_temp.cpp"

#endif



// 辅助函数：用vector创建链表
ListNode *createList(const std::vector<int> &vals)
{
    ListNode dummy(0);
    ListNode *curr = &dummy;
    for (int val : vals)
    {
        curr->next = new ListNode(val);
        curr = curr->next;
    }
    return dummy.next;
}

// 辅助函数：比较两个链表
bool compareLists(ListNode *l1, ListNode *l2)
{
    while (l1 && l2)
    {
        if (l1->val != l2->val)
            return false;
        l1 = l1->next;
        l2 = l2->next;
    }
    return !l1 && !l2; // 同时到达末尾
}

// 辅助函数：释放链表内存
void freeList(ListNode *head)
{
    while (head)
    {
        ListNode *temp = head;
        head = head->next;
        delete temp;
    }
}

void Test1()
{
    // 构造测试用例
    ListNode *l1 = createList({2, 4, 3});       // 表示数字 342
    ListNode *l2 = createList({5, 6, 4});       // 表示数字 465
    ListNode *expected = createList({7, 0, 8}); // 预期结果 807

    // 调用待测方法
    ListNode *result = Solution().addTwoNumbers(l1, l2);

    // 验证结果
    if (compareLists(result, expected))
    {
        std::cout << "Test1 passed ... OK!" << std::endl;
    }
    else
    {
        std::cout << "Test1 failed!" << std::endl;
    }

    // 释放内存
    freeList(l1);
    freeList(l2);
    freeList(expected);
    freeList(result);
}

void Test2()
{
    // 测试边界条件（例如进位）
    ListNode *l1 = createList({9, 9});
    ListNode *l2 = createList({1});
    ListNode *expected = createList({0, 0, 1});

    ListNode *result = Solution().addTwoNumbers(l1, l2);

    if (compareLists(result, expected))
    {
        std::cout << "Test2 passed ... OK!" << std::endl;
    }
    else
    {
        std::cout << "Test2 failed!" << std::endl;
    }

    freeList(l1);
    freeList(l2);
    freeList(expected);
    freeList(result);
}

int main()
{
    Test1();
    Test2();
    return 0;
}
